package com.rmy.common.utils.ffmpeg;

import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

public class FFMpegUtil {

    /**
     * 获取视频预览图
     * @param inputPath 视频文件路径
     * @param outputPath 预览图输出路径
     * @param time 视频截图时间点，格式为"00:00:00"
     * @return 是否成功获取预览图
     */
    public static boolean getVideoPreview(String inputPath, String outputPath, String time) {
        // ffmpeg命令行
        String cmd = "ffmpeg -i " + inputPath + " -ss " + time + " -vframes 1 -f image2 " + outputPath;
        try {
            // 执行命令行
            Process process = Runtime.getRuntime().exec(cmd);
            process.waitFor();
            return true;
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 获取视频预览图
     * @param inputFile 视频文件
     * @param outputFile 预览图输出文件
     * @param time 视频截图时间点，格式为"00:00:00"
     * @return 是否成功获取预览图
     */
    public static boolean getVideoPreview(File inputFile, File outputFile, String time) {
        return getVideoPreview(inputFile.getAbsolutePath(), outputFile.getAbsolutePath(), time);
    }

    /**
     * 获取视频预览图
     * @param inputStream 视频流
     * @param outputFile 预览图输出文件
     * @param time 视频截图时间点，格式为"00:00:00"
     * @return 是否成功获取预览图
     */
    public static boolean getVideoPreview(InputStream inputStream, File outputFile, String time) {
        // 将视频流保存到临时文件
        File tempFile = null;
        try {
            tempFile = File.createTempFile("temp", ".mp4");
            FileUtils.copyInputStreamToFile(inputStream, tempFile);
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        // 获取预览图
        boolean result = getVideoPreview(tempFile, outputFile, time);
        // 删除临时文件
        tempFile.delete();
        return result;
    }

    /**
     * 获取视频预览图
     * @param multipartFile 视频文件
     * @param outputFile 预览图输出文件
     * @param time 视频截图时间点，格式为"00:00:00"
     * @return 是否成功获取预览图
     */
    public static boolean getVideoPreview(MultipartFile multipartFile, File outputFile, String time) {
        // 将MultipartFile转换为File
        File inputFile = null;
        try {
            inputFile = File.createTempFile("temp", ".mp4");
            multipartFile.transferTo(inputFile);
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        // 获取预览图
        boolean result = getVideoPreview(inputFile, outputFile, time);
        // 删除临时文件
        inputFile.delete();
        return result;
    }
}
